package picol.model.asa.inst;

import java.util.ArrayList;
import java.util.List;
import picol.model.asa.expr.ASAExpr;

/**
 * Classe de gestion de l'instruction for
 * @author Aurélien Marcel - Julien Sanderson
 */
public class ASAInstFor extends ASAInst {

    private ASAExpr compteur;
    private ASAExpr condition;
    private ASAExpr modifCompteur;
    private List<ASAInst> listInst;

    public ASAInstFor() {
        this.listInst = new ArrayList<ASAInst>();
    }

    public void addInst(ASAInst _inst) {
        this.listInst.add(_inst);
    }

    public void setCompteur(ASAExpr _compteur) {
        this.compteur = _compteur;
    }

    public void setCondition(ASAExpr _condition) {
        this.condition = _condition;
    }

    public void setModifCompteur(ASAExpr _modifCompteur) {
        this.modifCompteur = _modifCompteur;
    }

    public void setListInst(List<ASAInst> listInst) {
        this.listInst = listInst;
    }

    @Override
    public void executer() {

        int evalCompteur = this.compteur.evalue();
        int evalCondition = this.condition.evalue();
        int evalModifCompteur = this.modifCompteur.evalue();
        while (evalCondition != 0) {
            for (ASAInst inst : this.listInst) {
                inst.executer();
            }
            evalCondition = this.condition.evalue();
            evalModifCompteur = this.modifCompteur.evalue();
        }

    }

	@Override
	public boolean executerDebug() {
		int evalCompteur = this.compteur.evalue();
        int evalCondition = this.condition.evalue();
        int evalModifCompteur = this.modifCompteur.evalue();
        if (evalCondition != 0) {
            if (this.listInst.iterator().hasNext()) {
                this.listInst.iterator().next().executerDebug();
            }
            evalCondition = this.condition.evalue();
            evalModifCompteur = this.modifCompteur.evalue();
        }
		return true;
	}

	@Override
	public int getNbInst() {
		int nbinst = 0;
		for (ASAInst inst : listInst){
			nbinst += inst.getNbInst();
			nbinst++;
		}
		return nbinst;
	}
}
